﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using AlgorytmyGenetyczne;
using AlgorytmyGenetyczne.Algorytmy;
using AlgorytmyGenetyczne.Operatory;
using AlgorytmyGenetyczne.WarunkiStopu;
using Funkcje;
using Wykres2D;

namespace AlgorytmyGenetyczneGUI
{
    partial class FormAlgorytmyGenetyczne
    {
        private int indeksPopulacjiHistorii = -1;
        private PAG algorytmGenetyczny;

        public int IndeksPopulacjiHistorii
        {
            get { return indeksPopulacjiHistorii; }
        }

        public void kliknietoStart()
        {
            userControlSterowanie.zmienStan();
            Rozwiazanie rozwiazanie = null;
            int iloscBadan = Int32.Parse(userControlSterowanie.textBoxLiczbaBadan.Text);

            double sumaWynikow = 0.0;
            for (int i = 0; i < iloscBadan; i++)
            {
                //uruchom algorytm
                indeksPopulacjiHistorii = -1;
                algorytmGenetyczny = new PAG(userControlParametry.Kodowania);
                algorytmGenetyczny.WielkoscPopulacji = userControlParametry.WielkoscPopulacji;
                algorytmGenetyczny.PrawdopodobienstwoMutacji = userControlParametry.PrawdopodobienstwoMutacji;
                algorytmGenetyczny.WarunekStopu = new WarunekStopuIloscPokolen(userControlParametry.IloscPokolen);
                algorytmGenetyczny.PrawdopodobienstwoKrzyzowania = userControlParametry.PrawdopodobienstwoKrzyzowania;

                ((SelekcjaRuletki) algorytmGenetyczny.Selekcja).Elitarnosc = userControlParametry.SukcesjaElitarna;
                ((SelekcjaRuletki) algorytmGenetyczny.Selekcja).WielkoscElity = userControlParametry.WielkoscElity;
                Rozwiazanie rozwiazanieAktualne = algorytmGenetyczny.ewolucja();
                sumaWynikow += rozwiazanieAktualne.Wartosc;
                if (rozwiazanie == null || rozwiazanieAktualne.Wartosc > rozwiazanie.Wartosc)
                {
                    rozwiazanie = rozwiazanieAktualne;
                }
            }
            userControlSterowanie.zmienStan();
            formWynik = new FormWynik();
            string wynik = rozwiazanie.ToString();
            File.WriteAllText("wynik.txt", wynik);
            MessageBox.Show(wynik);
        }
       
        #region Metody wywolujace odpowiednia metode wykresu

        public void pokazWykres()
        {
            pokazWykres2D();
        }

        public void zamknijWykres()
        {
            zamknijWykres2D();
        }
        #endregion

        #region Wykres2D
        private void pokazWykres2D()
        {
            double[] argumenty = algorytmGenetyczny.Rozwiazanie.Argumenty;
            double a, b, c, d, e;
            a = argumenty[0];
            b = argumenty[1];
            c = argumenty[2];
            d = argumenty[3];
            e = argumenty[4];
            string formula = String.Format("{0}*exp(-{1}*x1)*{2}*sin({3}*x1)+{4}*x1+3",a,b,c,d,e).Replace(",",".");
            formWykres2D = new FormWykres2D();
            List<Point3D> ListaPunktow = new List<Point3D>();
            foreach (var wezel in algorytmGenetyczny.wezly.ListaWezlow)
            {
                ListaPunktow.Add(new Point3D(wezel.Argument, 0.0, wezel.Wartosc));
            }
            formWykres2D.Wykres.ListaPunktow = ListaPunktow;
            formWykres2D.Wykres.narysujPunkty();
            formWykres2D.Wykres.PoczatekDziedziny = 0.05;
            formWykres2D.Wykres.KoniecDziedziny = 1.5;
            formWykres2D.Wykres.Funkcja = new Funkcja(formula, 1);
            formWykres2D.Wykres.narysujFunkcje();
            formWykres2D.Show();
        }
        
        private void zamknijWykres2D()
        {
            formWykres2D.Close();
        }
        #endregion



    }
}
